package com.czy.owner.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class DecimalUtil {
    /**
     * 金钱加法
     *
     * @param v1
     * @param
     * @return
     */
    public static String Retain(String v1) {
        if (StringUtils.isEmpty(v1))
            v1 = "0";

        BigDecimal bd = new BigDecimal(v1);
        return bd.setScale(1, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 金钱加法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static String add(String v1, String v2) {
        if (StringUtils.isEmpty(v1))
            v1 = "0";
        if (StringUtils.isEmpty(v2))
            v2 = "0";
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);

        BigDecimal bd = new BigDecimal(b1.add(b2).toString());
        return bd.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 格式化两位小数
     *
     * @param v1
     * @return
     * @param//||
     */
    public static String formatNum(String v1) {
        try {
            if (StringUtils.isEmpty(v1) || v1.length() == 0)
                v1 = "0.00";
            BigDecimal bd = new BigDecimal(v1);
            return bd.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        } catch (Exception e) {
            return "0.00";
        }


    }

    /**
     * 格式化两位小数
     *
     * @param v1
     * @return
     * @param//||
     */
    public static double formatDoubleNum(double v1) {
        BigDecimal bd = new BigDecimal(v1);
        return bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

    /**
     * 格式化两位小数
     *
     * @param v1
     * @param
     * @return
     */
    public static float formatFolatNum(String v1) {
        float price = Float.parseFloat(v1);
        int itemNum = 3;
        float totalPrice = price * itemNum;

        float num = (float) (Math.round(totalPrice * 100) / 100);//如果要求精确4位就*10000然后/10000
        return num;
    }

    /**
     * 格式化一位小数
     *
     * @param v1
     * @param
     * @return
     */
    public static String formatNumone(String v1) {
        if (StringUtils.isEmpty(v1))
            v1 = "0";

        BigDecimal bd = new BigDecimal(v1);
        return bd.setScale(2, BigDecimal.ROUND_HALF_UP).toString();

    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static String sub(String v1, String v2) {
        if (StringUtils.isEmpty(v1))
            v1 = "0";
        if (StringUtils.isEmpty(v2))
            v2 = "0";
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * @param v1
     * @param v2
     * @return
     */
    public static int multiplyInt(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);

        return b1.multiply(b2).intValue();
    }

    /**
     * 金钱乘法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static String multiply(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);

        return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 乘法
     *
     * @param v1    乘数
     * @param v2    被乘数
     * @param scale 小数点保留位数
     * @return
     */
    public static String multiplyWithScale(String v1, String v2, int scale) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        BigDecimal result = b1.multiply(b2);
        result = result.setScale(scale);
        return result.toString();
    }

    /**
     * 金钱除法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static String divide(String v1, String v2) {
        if (0 == Double.parseDouble(v1) || 0 == Double.parseDouble(v2)) {
            return "0.0";
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, 1, BigDecimal.ROUND_HALF_UP).toString();

    }

    /**
     * 如果除不断，产生无限循环小数，那么就会抛出异常，解决方法就是对小数点后的位数做限制
     *
     * @param v1
     * @param v2 小数模式 ，DOWN，表示直接不做四舍五入，参考{@link RoundingMode}
     * @return
     */
    public static String divideWithRoundingDown(String v1, String v2) {
        return divideWithRoundingMode(v1, v2, RoundingMode.DOWN);
    }

    /**
     * 选择小数部分处理方式
     */
    public static String divideWithRoundingMode(String v1, String v2,
                                                RoundingMode roundingMode) {
        return divideWithRoundingModeAndScale(v1, v2, RoundingMode.DOWN, 0);
    }

    /**
     * 选择小数点后部分处理方式，以及保留几位小数
     *
     * @param v1           除数
     * @param v2           被除数
     * @param roundingMode 小数处理模式
     * @param scale        保留几位
     * @return
     */
    public static String divideWithRoundingModeAndScale(String v1, String v2,
                                                        RoundingMode roundingMode, int scale) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, scale, roundingMode).toString();
    }

    /**
     * 金钱减法
     *
     * @param v1
     * @param v2
     * @return
     */
    public static String subtract(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).toString();
    }


}
